/*
 * VistaCompuerta.h
 *
 *  Created on: 25/11/2009
 *      Author: luis
 */

#ifndef VISTACOMPUERTA_H_
#define VISTACOMPUERTA_H_

#include <gtkmm.h>
#include "../Modelo/Entrada.h"
#include "../Modelo/Salida.h"
#include "../Modelo/Compuerta.h"
#include "../Modelo/ElementoExterno.h"
#include <list>
#include "../Modelo/Circuito.h"


class VistaCompuerta {
private:
	Circuito* circuito;

	/*
	 * Funciones para repintar en contexto
	 */
	void repintar_compuertas_en_context(Cairo::RefPtr<Cairo::Context> cr);
	void repintar_entrada(Cairo::RefPtr<Cairo::Context> cr);
	void repintar_salida (Cairo::RefPtr<Cairo::Context> cr);
	void repintar_elem_externos (Cairo::RefPtr<Cairo::Context> cr);


	/*
	 * Funciones que pintan en cairo las compuertas
	 */
	void pintar_and(int x, int y, Cairo::RefPtr<Cairo::Context> cr);
	void pintar_not(int x, int y, Cairo::RefPtr<Cairo::Context> cr);
	void pintar_xor(int x, int y, Cairo::RefPtr<Cairo::Context> cr);
	void pintar_or (int x, int y, Cairo::RefPtr<Cairo::Context> cr);
	void pintar_in (int x, int y, Cairo::RefPtr<Cairo::Context> cr);
	void pintar_out (int x, int y, Cairo::RefPtr<Cairo::Context> cr);
public:

	VistaCompuerta(Circuito* circuito);

	/*
	 * Funcion que repinta individualmente la compuerta pasada por parametro
	 */
	void pintar_compuerta(ElementoCircuital* elemento, Cairo::RefPtr<Cairo::Context> cr);


	void repintar_texto(Gtk::DrawingArea* area);


	void pintar_caja_negra (int cant_entradas, int cant_salidas,int x, int y, Cairo::RefPtr<Cairo::Context> cr);


	/*
	 * Funciones que repintan el texto correspondiente debajo del elemento
	 */
	void pintar_nombre_entrada (int x, int y, Gtk::DrawingArea* area, Entrada* entrada);


	void pintar_nombre_salida (int x, int y, Gtk::DrawingArea* area, Salida* salida);


	void pintar_tiempo_transicion(int x, int y, Gtk::DrawingArea* area, Compuerta* compuerta);


	void repintar_compuertas(Gtk::DrawingArea* area);


	void pintar_compuerta(int x, int y, Gtk::DrawingArea* area, int tipo);


	/*
	 * Funciones que devuelven un puntero al elemento que esta en la posicion x, y o NULL en caso
	 * contrario
	 */
	ElementoCircuital* get_elemento(int x, int y);

	/*
	 * Devuelve una compuerta si es que la hay en la posicion x, y sino NULL
	 */
	Compuerta* get_compuerta(int x, int y);

	/*
	 * Devuelve una entrada si es que lo hay en la posicion x, y sino NULL
	 */
	Entrada* get_entrada(int x, int y);

	/*
	 * Devuelve una salida si es que lo hay en la posicion x, y sino NULL
	 */
	Salida* get_salida(int x, int y);


	/*
	 * Devuelve un elemento externo si es que lo hay en la posicion x, y sino NULL
	 */
	ElementoExterno* get_elem_externo(int x, int y);


	/*
	 * Devuelve true si hay elementos en las listas, false en caso contrario
	 */
	bool hay_elementos();

	/*
	 * Pinta el estado del area de dibujo en el contexto
	 */
	void pintar_en_contexto (Gtk::DrawingArea* area, Cairo::RefPtr<Cairo::Context> cr);

	virtual ~VistaCompuerta();
};

#endif /* VISTACOMPUERTA_H_ */
